package xdu.lz.framework;

import xdu.lz.protocol.Protocol;
import xdu.lz.protocol.ProtocolFactory;
import xdu.lz.register.RemoteMapRegister;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

public class ProxyFactory<T> {
    public static Object getProxy(Class interfaceClass) {
        //interfaceClass本身就是接口，getInterfaces为null，没有继承接口
//        Class[] interfaces = interfaceClass.getInterfaces();
//       应该用这种写法
//        Class[] interfaces = new Class[]{interfaceClass};
        return Proxy.newProxyInstance(
                interfaceClass.getClassLoader(),
                new Class[]{interfaceClass},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /**
                         * 包装传输格式RequestWrap，代理
                         */
                        RequestWrap requestWrap =
                                new RequestWrap(
                                        interfaceClass.getName(), method.getName()
                                        , method.getParameterTypes(), args);
                        /**
                         * 去注册中心发现服务
                         * 可以负载均衡
                         */
//                List<URL> urlList = ZookeeperRegister.get(T.getName());
                        List<URL> urlList = RemoteMapRegister.get(interfaceClass.getName());
                        URL url = LoadBalance.random(urlList);
                        System.out.println(url);
                        /**
                         * 去调用暴露的服务， 通过不同的端口规则，取调用。
                         * 暴露服务的规则可以自定义：如dubbo，http等
                         */
                        Protocol protocol = ProtocolFactory.getProtocol();
                        String result = protocol.refer(url, requestWrap);
                        return result;
                    }
                });
    }
}
